package com.example.zhuzhuxia.schoolbusforstu;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.example.zhuzhuxia.schoolbusforstu.Utils.OkHttpUtils;
import org.json.JSONArray;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements BDLocationListener {


    private MapView mMapView;
    private BaiduMap baiduMap;
    public LocationClient mLocationClient = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        initViews();
        initMap();
    }

    private void initViews(){
        setContentView(R.layout.activity_main);
        mMapView = (MapView) findViewById(R.id.bmapView);
    }
    /**
     * 获取BaiduMap对象,并开始定位.
     */
    private void initMap(){
        baiduMap=mMapView.getMap();
        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
        mLocationClient.registerLocationListener(this);    //注册监听函数
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        int span=10000;
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocationClient.setLocOption(option);
        mLocationClient.start();
    }

    @Override
    protected void onResume() {
        super.onResume();
        s=0;
        mLocationClient.start();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLocationClient.stop();
        Log.e("TAG", "Pause...");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLocationClient.stop();
        Log.e("TAG", "destory...");
    }

    /**
     * 将某个location用图片绘制出来
     * @param baiduMap
     * @param location
     */
    private void showLocs(BaiduMap baiduMap,BDLocation location){
        baiduMap.setMyLocationEnabled(true);
        // 构造定位数据
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息，顺时针0-360
                .direction(100).latitude(location.getLatitude())
                .longitude(location.getLongitude()).build();
        // 设置定位数据
        baiduMap.setMyLocationData(locData);
        // 设置定位图层的配置（定位模式，是否允许方向信息，用户自定义定位图标）
        BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
                .fromResource(R.mipmap.myloc);
        MyLocationConfiguration.LocationMode mCurrentMode= MyLocationConfiguration.LocationMode.NORMAL;
        MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
        baiduMap.setMyLocationConfigeration(config);
    }

    /**
     * 将司机的汽车标注在地图上.
     */
    private void markLocs(){
        //定义Maker坐标点
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.mipmap.locimg);
        for(int i=0;i<locList.size();i++){
            LatLng point=new LatLng(locList.get(i).getLatitude(),locList.get(i).getLongitude());
            OverlayOptions options1= new MarkerOptions()
                    .position(point)
                    .icon(bitmap)
                    .zIndex(9)// 設置marker的所在層級
                    .draggable(true);// 设置手势拖拽;
            baiduMap.addOverlay(options1);
        }
    }
    /**
     * 将该位置放到map的中心.
     * @param location
     * @param baiduMap
     */
    private void updateMap(BaiduMap baiduMap,BDLocation location){

        MapStatus mMapStatus = new MapStatus.Builder()
                .target(new LatLng(location.getLatitude(), location.getLongitude()))
                .zoom(17)
                .build();
        //定义MapStatusUpdate对象，以便描述地图状态将要发生的变化
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        //改变地图状态
        baiduMap.animateMapStatus(mMapStatusUpdate);
    }

    private List<BDLocation> locList=new ArrayList<>();
    private Handler handler =new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch(msg.what){
                case 1:
                    markLocs();

                    break;
            }
        }
    };


    private int s=0;
    @Override
    public void onReceiveLocation(BDLocation location) {


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    locList=getBusLocs();
                    handler.sendEmptyMessage(1);

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        showLocs(baiduMap, location);
        if(s==0) {
            updateMap(baiduMap, location);
            s++;
        }

        StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());
        sb.append("\nerror code : ");
        sb.append(location.getLocType());
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());
        sb.append("\nradius : ");
        sb.append(location.getRadius());
        if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());// 单位：公里每小时
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());
            sb.append("\nheight : ");
            sb.append(location.getAltitude());// 单位：米
            sb.append("\ndirection : ");
            sb.append(location.getDirection());// 单位度
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");

        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());
            //运营商信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功，离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败，请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());// 位置语义化信息
        List<Poi> list = location.getPoiList();// POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
        Log.v("TAG", sb.toString());

    }

    /**
     * 请求获取多个司机的地理位置.
     * @return
     * @throws IOException
     */
    private List<BDLocation> getBusLocs() throws IOException, JSONException {

        String result=OkHttpUtils.get("http://1.xuebaxueba.applinzi.com/schoolbusgetlocs.php");
        if(result.compareTo("fault")==0){

            //当前司机都不在线;
            return null;
        }
        else {

            return getDataFromJson(result);
        }
    }

    /**
     * 解析json数据.
     * @param string
     * @return
     * @throws JSONException
     */
    private List<BDLocation> getDataFromJson(String string) throws JSONException {

        Log.e("TAG",string);
        ArrayList<BDLocation> list=new ArrayList<>();
        BDLocation location;
        JSONArray array=new JSONArray(string);
        for(int i=0;i<array.length()-1;i++){
            float lgt= (float) array.getJSONObject(i).getDouble("Buslongitude");
            float lat= (float) array.getJSONObject(i).getDouble("Buslatitude");
            location=new BDLocation();
            location.setLatitude(lat);
            location.setLongitude(lgt);
            list.add(location);
        }
        return list;
    }
}
